package com.blood.core.resp;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import lombok.Getter;


/**
 * @author yelong
 * @version 1.0
 * @date 2020/8/12 10:35
 * @description 1、处理结果，由ResultStatus生成，支持自定义处理结果的消息；2、不会携带数据，只代表处理结果
 */
@Getter
public final class HandleResult {

    private final boolean success;
    private final String code;
    private final String message;
    private final String timestamp;

    private HandleResult(boolean success, String code, String message) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.timestamp = DateUtil.now();
    }

    public boolean fail() {
        return !success;
    }

    // 通过处理结果对象，生成响应结果对象
    public <T> ResponseResult<T> response(T body) {
        return ResponseResult.createFrom(this, body);
    }

    public <T> ResponseResult<T> responseEmptyBody() {
        return response(null);
    }

    // 如果不指定自定义消息，则默认采用ResultStatus的消息
    public static HandleResult createFrom(ResultStatus status) {
        return new HandleResult(status.isSuccess(), status.getCode(), status.getMessage());
    }

    // 如果指定自定义消息，则自动加上ResultStatus的消息作为前缀
    public static HandleResult createFrom(ResultStatus status, String message) {
        return new HandleResult(status.isSuccess(), status.getCode(), message);
    }

    @Override
    public String toString() {
        return JSONUtil.toJsonStr(this);
    }
}
